﻿#ifndef __AVOID_CONTROL_IMAGE_HEAD_FILE_INCLUDED__
#define __AVOID_CONTROL_IMAGE_HEAD_FILE_INCLUDED__
#include <memory>
#include "ctlText.h"
#include "ctlDefine.h"
#include "ctlMatrix.h"
#include "x/xctlDefine.h"

namespace swui
{
	/* 图像重复规则
	 * X 和 Y 的规则可以用 enumTypeOr 函数组合起来	*/
	enum class ctlImageRepeat : unsigned {
		noRepeatX = 0x00, repeatX = 0x01, scaleX = 0x02,
		noRepeatY = 0x00, repeatY = 0x10, scaleY = 0x20,
		noRepeatXY = 0x00, repeatXY = 0x11, scaleXY = 0x22,
		maskX = 0x0f,  maskY = 0xf0
	};
	/* 对于 32 位颜色的图像，
	 * getDC 获取的 HDC 无用
	 * 对于 24 位颜色的图像
	 * 使用的是 getDC，但是 getGdipHandle 获取的句柄也可以使用
	 * 建议使用 24 位图像，绘制更加快速
	 * 如果能确定背景等，可以先将 32 位和背景混合成 24 位图像
	 * 另外不建议使用非 32 位及非 24 位的图像 */
	class ctlImage : public ctlMatrix
	{
	private:
		friend std::shared_ptr<ctlImage> createImage(unsigned, unsigned, ctlColorFormat);
		friend std::shared_ptr<ctlImage> createImage(void*, std::size_t);
		friend std::shared_ptr<ctlImage> createImage(const ctlText&);
		friend std::shared_ptr<ctlImage> createImage(const ctlImage*);
		ctlImage(const ctlImage&);
		ctlImage(unsigned w, unsigned h, ctlColorFormat color32);
		ctlImage(void* buffer, std::size_t len);
		ctlImage(const ctlText&);
	public:
		~ctlImage();
	public:
		bool isMatrixEnabled();
		void enableMatrix(bool);
	public:
		//获取 Gdiplus::Bitmap 对象（32 位）
		void* getGdipHandle();
		//获取 HDC（24 位）
		void* getDC() const;
		unsigned getHeight() const;
		unsigned getWidth() const;
		bool isColor32() const;
		bool isColor24() const;
	public:
		void preProcessMatrix();
		std::shared_ptr<ctlImage> preProcessMatrixNew();
		void setColor(unsigned x, unsigned y, ctlColor);
		void setColor(ctlPoint, ctlColor);
		ctlColor getColor(unsigned x, unsigned y);
		ctlColor getColor(ctlPoint);
	public:
	    //保存图片，返回 false 表示失败
	    bool saveImage(const ctlText& filename,
			const ctlText& mimeFormat = "image/png");
		void flush();
		bool fail() { return _fail; };
	private:
		void* _image;
		IStream* _stream;
		_ctlInterior::compatibleDC* _cpdc;
		bool _fail, _matrix_enable;
	};
	inline std::shared_ptr<ctlImage> createImage(unsigned width,
		unsigned height, ctlColorFormat color32 = ctlColorFormat::rgb)
	{
		return std::shared_ptr<ctlImage>(new ctlImage(width, height, color32));
	}
	inline std::shared_ptr<ctlImage> createImage(const ctlText& filename)
	{
		return std::shared_ptr<ctlImage>(new ctlImage(filename));
	}
	inline std::shared_ptr<ctlImage> createImage(void* buffer, std::size_t datalen)
	{
		return std::shared_ptr<ctlImage>(new ctlImage(buffer, datalen));
	}
	inline std::shared_ptr<ctlImage> createImage(const ctlImage* img)
	{
		return std::shared_ptr<ctlImage>(new ctlImage(*img));
	}
}

#endif
